//********************************************************************
//	created:	12:10:2011   20:35
//	filename: 	httprequest.h
//	author:		tiamo
//	purpose:	http reqeust
//********************************************************************

#pragma once

namespace utils
{
	//
	// http request
	//
	class HttpRequest : public BaseRequest
	{
	public:
		//
		// constructor
		//
		HttpRequest(wchar_t const* requestName) : BaseRequest(requestName)	{mHandle = nullptr;}

		//
		// destructor
		//
		virtual ~HttpRequest()												{reset();}

		//
		// reset
		//
		void reset();

		//
		// begin request
		//
		void beginRequest(wchar_t const* remoteURLFormat, ...);

		//
		// get redirect location
		//
		UniString getRedirectLocation();

		//
		// url encoding
		//
		static Utf8String urlEncoding(Utf8String const& inputURL);

		//
		// set cookie
		//
		void setCookie(wchar_t const* cookie)								{mCookie = cookie;}

		//
		// set post data
		//
		void setPostData(wchar_t const* dataBuffer)							{mPostData = utils::wideToUtf8(dataBuffer);}

		//
		// url encoding
		//
		static UniString urlEncoding(UniString const& inputURL)				{return utils::utf8ToWide(urlEncoding(utils::wideToUtf8(inputURL)));}

		//
		// get content
		//
		utils::DataBuffer& getContent()										{return mContent;}

	protected:
		//
		// write function
		//
		static size_t writeRoutine(char const* inputData, size_t size, size_t count, utils::DataBuffer* outputData);

		//
		// debug routine
		//
		static int debugRoutine(CURL* theHandle, curl_infotype infoType, char* messageBuffer, size_t messageSize, void* context);

		//
		// do request imp
		//
		virtual void doRequestImp();

	protected:
		//
		// curl handle
		//
		CURL*																mHandle;

		//
		// data buffer
		//
		DataBuffer															mContent;

		//
		// remote url
		//
		UniString															mRemoteURL;

		//
		// cookie
		//
		UniString															mCookie;

		//
		// post data
		//
		Utf8String															mPostData;
	};
}
